/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import util.Utils;

/**
 *
 * @author Fabricio
 */
public class Contato {

    private String nome;
    private String fone;
    private String celular;
    private String email;
    private int id;

    public String getCelular() {
        return celular;
    }

    public void setCelular(String celular) {
        this.celular = celular;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getFone() {
        return fone;
    }

    public void setFone(String fone) {
        this.fone = fone;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void isValid() throws Exception {
        
        if (nome == null) throw new Exception("O nome não pode ser vazio");
        
        if (nome.indexOf(" ") == -1 || nome.length() < 3 || nome.substring(nome.indexOf(" ")).length() < 2) {
            
            // valida se tem sobrenome
            throw new Exception("Você nao colocou o sobrenome");
            
        }
        
        if (nome.length() > 2) {
            
            // valida se o nome tem 2 letras consecutivas
            for (int i = 0; i < nome.length() - 1; i++) {
                char letra1 = nome.charAt(i);
                char letra2 = nome.charAt(i + 1);
                if (letra1 == letra2) {
                    throw new Exception("O nome está incorreto");
                }
            }
            
        }
        System.out.println("celular : "+celular);
        if (celular != null && celular.length() > 0){
            // verifica se tem 8 caracteres (o celular)
            if (celular.length() < 8 || celular.length() > 8)
                throw new Exception("O celular deve conter 8 caracteres numericos");
            
            // verifica se todos caracteres são digitos
            
            for (int i = 0; i < celular.length(); i++) {
                char digito = celular.charAt(i);
                if (!Character.isDigit(digito)) {
                    throw new Exception("Use apenas numeros no numero do celular");
                }
            }
        }
        
        if (fone != null && fone.length() > 0){
            // verifica se tem 8 caracteres (o fone)
            if (fone.length() < 8 || fone.length() > 8)
                throw new Exception("O Telefone deve conter 8 caracteres numericos");
            
            // verifica se todos caracteres são digitos
            
            for (int i = 0; i < celular.length(); i++) {
                char digito = celular.charAt(i);
                if (!Character.isDigit(digito)) {
                    throw new Exception("Use apenas numeros no telefone");
                }
            }
        }
            
        if (email != null && email.length() > 0){
            // caso diferente de email : a@a.a , ou seja size < 5
            if (email.length() < 5)
                throw new Exception("Email de tamanho invalido");
            
            // verifica se possui o @
            if (email.indexOf("@") == -1)
                throw new Exception("Email não possui arroba");
            
            // verifica se possui .
            if (email.indexOf(".") == -1)
                throw new Exception("Email não possui ponto");
            
            // verifica se o @ esta antes do .
            String depoisDoArroba = email.substring(email.indexOf("@"));
            if (depoisDoArroba.indexOf(".") == -1)
                throw new Exception("Email não existe um ponto no email apos o @");
            
            // verifica se possui algum caracter diferente de letras, digitos, @ ou .
            Exception e = new Exception("O email tem caracteres invalidos");
            for (int i = 0; i < email.length(); i++) {
                char letra = email.charAt(i);
                
                if (letra != '@' && letra != '.'){
                    // verifica se é numero ou letra
                    if (letra < 48)
                        throw e;
                    if (letra < 65 && letra > 57)
                        throw e;
                    if (letra > 122)
                        throw e;
                    if (letra > 90 && letra < 96)
                        throw e;
                }
            }
        }
        
        
        
        if (celular.length() == 0 && fone.length() == 0 && email.length() == 0)
            throw new Exception("Um contato deve ter pelo menos o celular, ou fone ou email");
    }

    /**
     * Converte a instancia do objeto em um array de bytes para persistencia
     * @return 
     */
    public byte[] toByteArray() {
        try {
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            DataOutputStream dataOutput = new DataOutputStream(output);
            dataOutput.writeInt(getId());
            dataOutput.writeUTF(getNome());
            dataOutput.writeUTF(getFone());
            dataOutput.writeUTF(getCelular());
            dataOutput.writeUTF(getEmail());
            return output.toByteArray();
        } catch (Exception ex) {
            return (byte[]) Utils.die("Erro ao converter o Contato para byte[]", ex);
        }
    }

    public Contato() {
    }

    /**
     * Recebe um array de bytes e insere os dados desse array no objeto,
     * esse array de bytes pode ser obtido com o metodo toByteArray()
     * @param arrayByte 
     */
    public Contato(byte[] arrayByte) {
        ByteArrayInputStream input = new ByteArrayInputStream(arrayByte);
        DataInputStream dataInput = new DataInputStream(input);
        try {
            id = (dataInput.readInt());
            nome = (dataInput.readUTF());
            fone = (dataInput.readUTF());
            celular = (dataInput.readUTF());
            email = (dataInput.readUTF());
        } catch (IOException ex) {
            Utils.die("Erro ao ler o contato", ex);
        }
    }    
}
